'''
测试用例ID: XXX_XXX
测试用例名称:RS422配置测试用例
测试用例版本:0.0.1
测试目的:验证RS422是否可配置,发送数据功能是否正常
前置条件:
    a)控制通道正常工作
    b)待测目标机正常工作
测试方法：
    a)通过控制通道向待测目标机发送RS422配置命令
    b)在控制通道等待目标机返回的执行结果
通过判据:
    a)发送配置命令后2秒内能够接收到待测目标机执行配置命令返回
    b)待测目标机返回结果为OK
'''

############################模板代码起始########################
testCaseId = "abcd" #测试用例ID

########导入测试驱动库
import os
import sys
import json
sys.path.append(r'D:\work\5ShuangRan\project\618\HTP\demo\src\TestAgent\TestDrvLib')
import ctrlChlLib       #控制通道驱动库
import rs422DrvLib      #RS422功能驱动库
import loggerLib        #测试日志功能库
import dataRcLib        #测试数据功能库

########获取脚本输入参数
script_input = json.loads(sys.argv[1])
ctrlDevCfg = script_input['ctrl_intf']

########定义测试用例参数
baud_rate = None #波特率
send_data = None
log_file = None
data_file = None

########定义日志文件对象
logger = loggerLib.Logger(__file__, testCaseId)
if log_file is not None:
    logger.set_file(log_file)

########定义数据文件对象
datRec = dataRcLib.DataRecord(__file__, testCaseId)
if data_file is not None:
    datRec.set_file(data_file)

#创建本地控制通道设备对象
logger.Log("创建控制通道本地设备对象")
ctrlDev = ctrlChlLib.CtrlChlDev()

#初始化控制通道设备
logger.Log(f"初始化控制通道本地设备，配置:{ctrlDevCfg}")
result = ctrlDev.Init(ctrlDevCfg)
if result is False:
    logger.Log("初始化控制通道本地设备失败")
    os._exit(1)

logger.Log(f'==========开始执行测试用例{testCaseId}===========')
############################模板代码结束########################


############################用户代码起始########################
#导入库
import json
import threading

########定义测试用例流程
#创建上位机RS422设备对象
logger.Log("创建上位机RS422设备对象")
rs422Dev = rs422DrvLib.SerialPort()
rs422Cfg = {
    'port': 'COM1',
    'baudrate': baud_rate,
    'bytesize': 8,
    'parity': 'N',
    'stopbits': 1
}

#初始化上位机RS422设备对象
result = rs422Dev.Init(rs422Cfg)
if result is False:
    logger.Log("初始化上位机RS422设备失败")
    os._exit(1)

#通过控制通道向目标机发送指令,设置目标机RS422配置参数
logger.Log(f"通过控制通道向目标机发送指令,设置目标机RS422波特率={baud_rate}")
cmd_cfg = {
    'dev': 'rs422',
    'opt': 'config',
    'arg': 'baud_rate',
    'val': baud_rate
}
result = ctrlDev.Write(json.dumps(cmd_cfg))
if result is False:
    logger.Log("通过控制通道向目标机发送RS422配置指令失败")
    rs422Dev.Reset()
    os._exit(1)

#等待并接收目标机RS422配置回复
ans_data = ctrlDev.Read(timeout=2.0)
if len(ans_data)==0:
    logger.Log("在控制通道等待目标机RS422配置响应超时")
    rs422Dev.Reset()
    os._exit(1)

#检查目标机执行RS422配置结果
ans = ans_data[-1]
res = json.loads(ans)
if res['retcode'] != 0:
    logger.Log(f"目标机执行RS422配置失败{res['ret']},{res['desp']}")
    rs422Dev.Reset()
    os._exit(1)
else:
    logger.Log(f"目标机执行RS422配置成功")


#定义RS422接收数据线程函数
def rs422_recv():
    #等待目标机RS422发送数据
    logger.Log("在上位机RS422等待目标机RS422发送的数据")
    rx_data = rs422Dev.Read(timeout=2.0)
    if rx_data is None:
        logger.Log("在上位机RS422等待目标机RS422发送数据失败,超时")
        return False
    logger.Log(f"在上位机RS422接收到目标机RS422发送的数据{rx_data}")

    #记录接收到目标机RS422发送的数据
    datRec.Rec('target-RS422-2', 'host-RS422-1', rx_data)

    #判断接收到目标机RS422发送的数据内容正确性
    if rx_data != send_data:
        logger.Log("数据内容校验校验失败:在上位机RS422接收到目标机RS422发送的数据与设定值不一致")
        return False  
    return True

#开启接收目标机RS422数据线程
logger.Log("在上位机开启接收目标机RS422f发送数据的线程")
rs422_recv_trd = threading.Thread(target=rs422_recv)
rs422_recv_trd.start()

#向目标机发送RS422写操作指令
logger.Log(f"通过控制通道向目标机指令,让目标机RS422执行写操作,写数据为'{send_data}'")
cmd_send = {
    'dev': 'rs422',
    'opt': 'write',
    'arg': 1,
    'val':  send_data
}
result = ctrlDev.Write(json.dumps(cmd_send))
if result is False:
    logger.Log("通过控制通道向目标机发送指令失败,指令为让目标机RS422执行写操作,写数据为'{send_data}'")
    rs422Dev.Reset()
    os._exit(1)

#等待接收线程结束
rs422_recv_trd.join()

#关闭本地RS422设备
logger.Log("关闭上位机RS422设备")
rs422Dev.Reset()

#判断测试用例执行结果

############################用户代码结束########################


############################模板代码起始########################
#测试用例执行结束
logger.Log(f'==============测试用例{testCaseId}执行结束==========')
os._exit(0)
############################模板代码结束########################